package es.ucm.fdi.pe.practica2.genetico2.cruce;

import java.util.ArrayList;

import es.ucm.fdi.pe.practica2.genetico2.Alumno;
import es.ucm.fdi.pe.practica2.genetico2.CromosomaAlumnos;

public class CrucePMX {
	
	public void cruce(CromosomaAlumnos padre1, CromosomaAlumnos padre2){
		//puntos de cruce p1 y p2
		int p1 = (int) (Math.random()* (padre1.getN())+1);
		int p2 = (int) (Math.random()* (padre2.getN())+1);
		
		while(p1==p2||p1==0 && p2==padre1.getN()){
			 p1 = (int) (Math.random()* (padre1.getN())+1);
			 p2 = (int) (Math.random()* (padre2.getN())+1);
		}
		
		if(p2<p1){
			int tmp=p1;
			p1=p2;
			p2=tmp;
		}
		
		try{
			ArrayList<Alumno> genes1 = trozos(padre1.getGruposAlumnos(),padre2.getGruposAlumnos(),p1,p2);
			ArrayList<Alumno> genes2 = trozos(padre2.getGruposAlumnos(),padre1.getGruposAlumnos(),p1,p2);
			
			padre1.setGruposAlumnos(genes1);
			padre2.setGruposAlumnos(genes2);
		} catch (Exception e){
			e.printStackTrace();
		}
		
	}

	private ArrayList<Alumno> trozos(ArrayList<Alumno> gruposAlumnos1,
			ArrayList<Alumno> gruposAlumnos2, int p1, int p2) throws Exception {

		ArrayList<Alumno> genes = new ArrayList<Alumno>(gruposAlumnos1.size());
		for(int j=0;j<gruposAlumnos1.size();j++){
			Alumno al = new Alumno(j,5);
			genes.add(al);
		}
		for(int i=0;i<gruposAlumnos1.size();i++){
			if(p1<=i && i<p2){
				genes.set(i, gruposAlumnos2.get(i));
			}else{ 
				Alumno a= gruposAlumnos1.get(i);
				int pos_en_otro_crom=p1;
				do{
					if(gruposAlumnos2.get(pos_en_otro_crom).equals(a)){
						a=gruposAlumnos1.get(pos_en_otro_crom);
						pos_en_otro_crom=p1;
						continue;
					}
					pos_en_otro_crom++;
				} while(pos_en_otro_crom<p2);
				genes.set(i, a);
			}
		}
		return genes;
	}


}
